/**
 * axios 二次封装
 * author: LeiHao
 * createTime: 2023/12/28
 */

import axios from 'axios'
import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import 'element-plus/dist/index.css'
import useAppStore from '@/store/modules/app';
import router from '@/router';

// 是否显示重新登录
export let isRelogin = {
    show: false
};

// 设置header
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

let interceptorsLock = false; // 拦截器锁，防止弹出多个对话框

// 创建axios实例
const service = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL: import.meta.env.VITE_APP_BASE_API,

    // 超时
    timeout: 30000
})

// request拦截器
service.interceptors.request.use(config => {

    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false

    if (!isToken) {
        config.headers['token'] = useAppStore().token; // 让每个请求携带自定义token 请根据实际情况自行修改
    }

    // 区分平台
    // config.headers['platType'] = 0;

    // 用户 所属机构
    /* if (getRegion()) {
        config.headers['region'] = getRegion();
    } */

    // 所有接口添加平台区分字段
    const { data, params, method, headers } = config;
    if (method.toUpperCase() === 'GET') {
        config.params = Object.assign({}, params)
    } else if (headers.Multipart) {
        config.data = data;
    } else {
        config.data = Object.assign({}, data);
    }

    // loadingInstance = ElLoading.service({
    //     lock: true,
    //     background: 'rgba(255, 255, 255, .65)',
    //     text: '努力加载中...'
    // });

    return config
}, error => {
    console.log(error)
    Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
    // if (loadingInstance) {
    //     loadingInstance.close();
    //     loadingInstance = null;
    // }

    // 如果已经锁止，则直接走异常
    if (interceptorsLock) {
        return Promise.reject(res);
    }

    // console.log(res);
    // 二进制数据则直接返回
    if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
        return res.data
    }

    // 未设置状态码则默认成功状态
    const code = res.data.code || '00000';

    // 获取错误信息
    // const msg = errorCode[code] || res.data.msg || errorCode['default']
    const msg = res.data.msg

    if (code === '10002') {
        if (!isRelogin.show) {
            isRelogin.show = true;
            ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                confirmButtonText: '重新登录',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {

            }).catch(() => {
                isRelogin.show = false;
            });
        }
        return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
    } else if (code === 401) {
        interceptorsLock = true;
        console.log('401: ', router)
        ElMessageBox.alert('当前用户登入信息已失效，请重新登入再操作', '提示', {
            confirmButtonText: '确定',
            closeOnClickModal: false,
            closeOnPressEscape: false,
            callback: (action) => {   
                interceptorsLock = false;
            }
        });
    } else if (code === 500) {
        ElMessage({
            message: msg,
            type: 'error'
        })
        return Promise.reject(new Error(msg))
    } else if (code === '00000' || code === '0') {
        return Promise.resolve(res.data)
    } else {
        ElNotification.error({
            title: msg
        })
        return Promise.reject('error')
    }
}, error => {
    console.log('err' + error)
    let { message } = error;
    if (message == "Network Error") {
        message = "后端接口连接异常";
    } else if (message.includes("timeout")) {
        message = "系统接口请求超时";
    } else if (message.includes("Request failed with status code")) {
        message = "系统接口" + message.substr(message.length - 3) + "异常";
    }

    ElMessage({
        message: message,
        type: 'error',
        duration: 5 * 1000
    })
    return Promise.reject(error)
});

export default service;